package com.powernode.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.powernode.constant.ManagerConstants;
import com.powernode.constant.SysRoleConstants;
import com.powernode.domain.SysRole;
import com.powernode.domain.SysRoleMenu;
import com.powernode.mapper.SysRoleMapper;
import com.powernode.mapper.SysRoleMenuMapper;
import com.powernode.service.SysRoleMenuService;
import com.powernode.service.SysRoleService;
import com.powernode.util.AuthUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Service
@CacheConfig(cacheNames = "com.powernode.service.impl.SysRoleServiceImpl") // 加入缓存
public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements SysRoleService {
    @Autowired
    private SysRoleMapper sysRoleMapper;
    @Autowired
    private SysRoleMenuMapper sysRoleMenuMapper;
    @Autowired
    private SysRoleMenuService sysRoleMenuService;

    /*
     * 查询系统角色列表  全量查询  需要缓存
     * @author RenBoQing
     * @date 2024/7/9 20:23
     * @return java.util.List<com.powernode.domain.SysRole>
     */
    @Override
    @Cacheable(key = SysRoleConstants.ALL_ROLES)
    public List<SysRole> queryAllSysRoleList() {
        return sysRoleMapper.selectList(new LambdaQueryWrapper<SysRole>().orderByDesc(SysRole::getCreateTime));
    }

    /*
     * 新增角色
     * @author RenBoQing
     * @date 2024/7/12 21:53
     * @param sysRole
     * @return java.lang.Boolean
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    @CacheEvict(key = ManagerConstants.SYS_ALL_ROLE_KEY) // 删除缓存
    public Boolean saveSysRole(SysRole sysRole) {
        sysRole.setCreateTime(new Date());
        sysRole.setCreateUserId(AuthUtils.getLoginUserId());
        // 1.添加角色信息
        int insert = sysRoleMapper.insert(sysRole);
        if (insert > 0) {
            // 2.添加角色权限信息
            Long roleId = sysRole.getRoleId();
            // 获取角色权限集合
            List<Long> menuIdList = sysRole.getMenuIdList();
            // 创建角色与权限信息的集合对象
            List<SysRoleMenu> sysRoleMenuList = new ArrayList<>();
            if (CollectionUtils.isNotEmpty(menuIdList)&&menuIdList.size() !=0) {
                // 遍历菜单id集合
                menuIdList.forEach(menuId -> {
                    // 添加角色权限信息
                    SysRoleMenu roleMenu = new SysRoleMenu();
                    roleMenu.setRoleId(roleId);
                    roleMenu.setMenuId(menuId);
                    // 装入集合中
                    sysRoleMenuList.add(roleMenu);
                });
                // 批量添加角色权限信息
                boolean saveBatch = sysRoleMenuService.saveBatch(sysRoleMenuList);
            }
        }
        return true;
    }

    /*
     * 根据角色的标识查询角色详情
     * @author RenBoQing
     * @date 2024/7/18 21:57
     * @param roleId
     * @return com.powernode.domain.SysRole
     */
    @Override
    public SysRole querySysRoleInfoByUserId(Long roleId) {
        // 根据角色的标识查询角色详情
        SysRole sysRole = sysRoleMapper.selectById(roleId);
        // 根据角色的标识查询 权限的集合
        List<SysRoleMenu> sysRoleMenuList = sysRoleMenuMapper.selectList(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, roleId));
        if (CollectionUtils.isNotEmpty(sysRoleMenuList) && sysRoleMenuList.size() != 0) {
            // 创建权限id集合
            List<Long> menuIdList = sysRoleMenuList.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList());
            // 设置权限id集合 到sysRole对象中
            sysRole.setMenuIdList(menuIdList);
        }
        // 返回角色详情
        return sysRole;
    }

    /*
     *  修改角色信息
     * @author RenBoQing
     * @date 2024/7/18 22:19
     * @param sysRole
     * @return boolean
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    @CacheEvict(key = ManagerConstants.SYS_ALL_ROLE_KEY) // 删除缓存
    public boolean modifySysRole(SysRole sysRole) {
        // 获取角色袁
        // 1.删除角色原有权限信息集合
        int delete = sysRoleMenuMapper.delete(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, sysRole.getRoleId()));
        // 2.添加角色权限信息
        Long roleId = sysRole.getRoleId();
        // 获取角色权限集合
        List<Long> menuIdList = sysRole.getMenuIdList();
        // 创建角色与权限信息的集合对象
        List<SysRoleMenu> sysRoleMenuList = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(menuIdList) && menuIdList.size() != 0) {
            // 遍历菜单id集合
            menuIdList.forEach(menuId -> {
                // 添加角色权限信息
                SysRoleMenu roleMenu = new SysRoleMenu();
                roleMenu.setRoleId(roleId);
                roleMenu.setMenuId(menuId);
                // 装入集合中
                sysRoleMenuList.add(roleMenu);
            });
            // 批量添加角色权限信息
            boolean saveBatch = sysRoleMenuService.saveBatch(sysRoleMenuList);
        }
        // 更新角色的其他信息
        return sysRoleMapper.updateById(sysRole) > 0;
    }
    /*
     * 删除单个角色/批量删除角色
     * @author RenBoQing
     * @date 2024/7/18 22:45
     * @param roleIds
     * @return boolean
     */
    @Override
    public boolean removeSysUserListByUserIds(List<Long> roleIdList) {
        if (CollectionUtils.isNotEmpty(roleIdList) && roleIdList.size() != 0) {
            // 删除角色信息
            int deleteRole = sysRoleMapper.deleteBatchIds(roleIdList);
            // 删除角色权限信息
            int deleteRoleMenuList = sysRoleMenuMapper.delete(new LambdaQueryWrapper<SysRoleMenu>().in(SysRoleMenu::getRoleId, roleIdList));
            return deleteRole > 0 && deleteRoleMenuList > 0;
        }
        return false;
    }
}
